﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using DatabaseRW;
using System.Data.SqlClient;

namespace ModelConfigurator
{
    public partial class FormEditDB : Form
    {
        DBRW db = new DBRW();
        DataSet ds = new DataSet();
        SqlDataAdapter adap = null;
        bool flag = false, flag2 = false; string check = "";

        public FormEditDB(DBRW db_library)
        {
            InitializeComponent();
            db = db_library;
        }

        private void btnOK_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void FormEditDB_Load(object sender, EventArgs e)
        {
            UpdateTableList();
        }

        /// <summary>
        /// Получение (обновление) списка таблиц
        /// </summary>
        void UpdateTableList()
        {
            cmbBoxTableList.Items.Clear();
            List<string> lst = db.GetTableList();
            if (lst != null)
            {
                foreach (string s in lst)
                {
                    cmbBoxTableList.Items.Add(s);
                }
                cmbBoxTableList.SelectedIndex = 0;
            }
        }

        bool view = true;
        /// <summary>
        /// Просмотр таблицы
        /// </summary>
        /// <param name="NameTable">Имя таблицы</param>
        private void ViewTable(string NameTable)
        {
            view = false;
            ds = new DataSet();
            adap = new SqlDataAdapter("SELECT * FROM " + NameTable, db.myConnection);
            SqlCommandBuilder cb = new SqlCommandBuilder(adap);
            adap.UpdateCommand = cb.GetUpdateCommand();
            adap.InsertCommand = cb.GetInsertCommand();
            adap.DeleteCommand = cb.GetDeleteCommand();
            adap.Fill(ds);
            dGV.DataSource = ds.Tables[0];
            view = true;
        }

        /// <summary>
        /// Возникновение обработчика при изменении свойства SelectedIndex 
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void cmbBoxTableList_SelectedIndexChanged(object sender, EventArgs e)
        {
            ViewTable(cmbBoxTableList.Items[cmbBoxTableList.SelectedIndex].ToString());
            if (flag2)
            {
                flag2 = false;
                flag = false;
            }
        }
        bool flag3 = false;

        private void dGV_CellValueChanged(object sender, DataGridViewCellEventArgs e)
        {
            try
            {
                this.Validate();
                if (flag3 && dGV.Columns[e.ColumnIndex].Name == "DistribT")
                {
                    flag3 = false;
                    return;
                }
                if (e.RowIndex == dGV.Rows.Count - 2 && flag2 || ds.Tables[0].Rows.Count == 0)// || dGV.Rows.Count == 2)
                //если добавляем строку
                {
                    flag = true;
                }
                ds.Tables[0].GetChanges();
                adap.Update(ds.Tables[0]);
                if (dGV.Columns[e.ColumnIndex].Name == "TableName" && flag == false)//если изменяем имя таблицы ресурсов
                {
                    CheckTable(e.RowIndex);
                    string s = ds.Tables[0].Rows[e.RowIndex][2].ToString();
                    db.AddTableTableName(s);
                    UpdateTableName();
                }
                //если добавляем строку в таблицу Категория
                if (cmbBoxTableList.Items[cmbBoxTableList.SelectedIndex].ToString() == "Category" && flag)
                {
                    string s = ds.Tables[0].Rows[e.RowIndex][2].ToString();
                    db.AddTableTableName(s);
                    UpdateTableName();
                }
                flag = true;
                ds.Tables[0].Clear();
                ViewTable(cmbBoxTableList.Items[cmbBoxTableList.SelectedIndex].ToString());
                flag = false; flag2 = false;
            }
            catch (Exception)
            {

            }
        }

        /// <summary>
        /// Обновление списка таблиц в соответствии с изменением в таблице Категория
        /// </summary>
        void UpdateTableName()
        {
            UpdateTableList();
            int u = 0;
            for (int i = 0; i < cmbBoxTableList.Items.Count; i++)
            {
                if (cmbBoxTableList.Items[i].ToString() == "Category")
                {
                    u = i; break;
                }
            }
            cmbBoxTableList.SelectedIndex = u;
        }

        private void dGV_RowsRemoved(object sender, DataGridViewRowsRemovedEventArgs e)
        {
            try
            {
                adap.Update(ds.Tables[0]);
                if (cmbBoxTableList.Items[cmbBoxTableList.SelectedIndex].ToString() == "Category" && flag == false && view)
                {
                    CheckTable(e.RowIndex);
                }
            }
            catch (Exception)
            {
            }
        }

        /// <summary>
        /// Проверка на необходимость таблицы ресурсов
        /// </summary>
        /// <param name="RowIndex">Индекс строки</param>
        void CheckTable(int RowIndex)
        {
            bool temp = false;
            //проверка нужна ли таблица  (при условии, что данная таблица имеет другую категорию ресурсов)
            for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
            {
                if (RowIndex != i)
                {
                    if (check == ds.Tables[0].Rows[i][2].ToString())
                    {
                        temp = true;//нужна
                        break;
                    }
                }
            }
            if (temp == false)//если таблица не нужна, удаляем ее
            {
                db.DeleteTable(check);
                view = false;
                UpdateTableName();
                view = true;
            }
        }

        private void dGV_CellEnter(object sender, DataGridViewCellEventArgs e)
        {
            if (dGV.Columns[e.ColumnIndex].Name == "DistribT")
            {
                var cell = dGV.CurrentCell;
                var cellDisplayRect = dGV.GetCellDisplayRectangle(e.ColumnIndex, e.RowIndex, false);

                toolTip1.Show("Exponential, Normal, Uniform", dGV,
                              cellDisplayRect.X + cell.Size.Width / 2,
                              cellDisplayRect.Y + cell.Size.Height / 2, 2000);
                dGV.ShowCellToolTips = false;
            }
            if (dGV.Columns[e.ColumnIndex].Name == "TableName")
            {
                check = dGV.Rows[e.RowIndex].Cells[e.ColumnIndex].Value.ToString();
            }
            else
                if (cmbBoxTableList.Items[cmbBoxTableList.SelectedIndex].ToString() == "Category")
                    check = dGV.Rows[e.RowIndex].Cells[2].Value.ToString();
        }

        private void dGV_CellEndEdit(object sender, DataGridViewCellEventArgs e)
        {
            if (dGV.Columns[e.ColumnIndex].Name == "DistribT")
            {
                if (dGV.Rows[e.RowIndex].Cells[e.ColumnIndex].Value.ToString() == null)
                    dGV.Rows[e.RowIndex].Cells[e.ColumnIndex].Value = "";
                switch (dGV.Rows[e.RowIndex].Cells[e.ColumnIndex].Value.ToString())
                {
                    case "Exponential":
                        break;
                    case "Normal":
                        break;
                    case "Uniform":
                        break;
                    default:
                        flag3 = true;
                        dGV.Rows[e.RowIndex].Cells[e.ColumnIndex].Value = "Exponential";
                        break;
                }

            }
        }

        private void dGV_DataError(object sender, DataGridViewDataErrorEventArgs e)
        {
            MessageBox.Show("Некорректно введены данные", "Ошибка", MessageBoxButtons.OK);
        }

        private void dGV_UserAddedRow(object sender, DataGridViewRowEventArgs e)
        {

        }

        private void dGV_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e)
        {
            if (cmbBoxTableList.Items[cmbBoxTableList.SelectedIndex].ToString() == "Category")
            {
                flag2 = true;
            }
        }

        private void dGV_UserDeletingRow(object sender, DataGridViewRowCancelEventArgs e)
        {

        }

        private void dGV_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {

        }
    }

    class ListNameCategory
    {
        public List<string> category = new List<string>();

        public string table;

        public ListNameCategory()
        {

        }
    }
}
